package cn.biplam.back.sql.type;

import java.io.Serializable;

import cn.biplam.common.wrapper.ErrorMessage;

/**
 * Int数据元 
 * <li>数据范围：10位10进制数 
 * @author 	WangSong
 * @create 	Mar 11, 2009 11:03:56 AM
 * @version 1.0
 */
public final class Int implements Type,Serializable{

	private static final int INT_MAX_LENGTH=10;
	private static final long serialVersionUID = 4271601981427498960L;
	private static final String sTypeName="INT";

	private boolean bIsNull=true;
	private int iLength=INT_MAX_LENGTH;
	private int iValue=0;

	/**
	 * 构造方法 创建一个空值(isNull=true)的Int数据元 长度=10
	 */
	public Int(){}

	/**
	 * 构造方法
	 * @param iValue int
	 */
	public Int(int iValue){
		this.setValue(iValue);
	}

	/**
	 * 构造方法
	 * @param iValue Integer
	 */
	public Int(Integer iValue){
		this.setValue(iValue);
	}

	/**
	 * 构造方法
	 * @param sValue 内容为数字的字符串
	 * @throws ErrorMessage
	 */
	public Int(String sValue) throws ErrorMessage{
		this.setValue(sValue);
	}

	/**
	 * 返回数据元的数据类型的完整描述
	 * @return
	 */
	public String getType(){
		return sTypeName;
	}

	/**
	 * 返回数据元数据类型的关键字
	 * @return
	 */
	@SuppressWarnings("static-access")
	public String getTypeName() {
		return this.sTypeName;
	}

	/**
	 * 获得数据元的值，其内容必须经过初始化/设置(允许0)
	 * @see isNull()
	 * @return
	 * @throws ErrorMessage
	 */
	public String getValue() throws ErrorMessage {
		if(this.bIsNull){
			ErrorMessage eMsg=new ErrorMessage("Int type is empty!");
			throw eMsg;
		}else{
			return Integer.toString(iValue);
		}
	}

	/**
	 * 查询数据元内容是否为空
	 * @return
	 */
	public boolean isNull(){
		return bIsNull;
	}

	/**
	 * 返回数据元的长度
	 * @return
	 */
	public int getPercesion(){
		return iLength;
	}

	/**
	 * 设置数据元的长度
	 * 			设置并检查Int类型长度是否符合规范
	 * @param length
	 * @throws ErrorMessage
	 */
	public void setLength(int length) throws ErrorMessage {

		ErrorMessage eMsg=null;

		if(iLength>INT_MAX_LENGTH){
			StringBuilder sb = new StringBuilder();
			sb.append("Int type length(");
			sb.append(length);
			sb.append(") is too long!");
			eMsg=new ErrorMessage(sb.toString());
			throw eMsg;
		}else if(iLength<1){
			StringBuilder sb = new StringBuilder();
			sb.append("Int type length(");
			sb.append("length");
			sb.append(") error!");
			eMsg=new ErrorMessage(sb.toString());
		}

		if(eMsg==null){
			this.iLength=length;
		}else{
			throw eMsg;
		}

	}

	/**
	 * 设置Int数据元的值
	 * @param value 
	 */
	public void setValue(int value) {
		iValue = value;
		this.bIsNull=false;
	}

	/**
	 * 设置数据元的值(不允许传入null)
	 * @param sValue 内容为数字的字符串
	 * @throws ErrorMessage
	 */
	public void setValue(String sValue) throws ErrorMessage{
		try {
			this.iValue=Integer.parseInt(sValue);
			this.bIsNull=false;
		} catch (NumberFormatException e) {
			StringBuilder sb = new StringBuilder();
			sb.append("String: ");
			sb.append(sValue);
			sb.append(" cannot be convert to int!");
			ErrorMessage eMsg =new ErrorMessage(sb.toString());
			throw eMsg;
		}
	}

	/**
	 * 返回SQL语法表示的数据内容的字符串，如果内容为空，表示为0
	 * @return
	 */
	public String toString() {
		return Integer.toString(iValue);
	}

	/**
	 * 返回数据源精度，数据元精度默认0
	 * @return
	 */
	public int getScale() {
		return 0;
	}

}
